home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 297_01 / exampl5.spr < prev    next >
Text File  |  1980-01-01  |  1KB  |  61 lines

  1. /* example5.spr */
  2. /* recursion */
  3.  
  4. /* Recursion is especially useful when the data structures are recursively
  5.    defined.
  6.    An arithmetic expression is a well known example of such a structure.
  7.    We shall define an arithmetic expression as follows:
  8.    <expression> ::== <integer>
  9.            |    (<expression> <operator> <expression>)
  10.  
  11.    <operator> ::==  plus |
  12.            minus |
  13.            times
  14.  */
  15.  
  16. /* We shall evaluate expressions with the predicate evaluate.
  17.     There are several rules for evaluate:
  18.    If the first one does not work then the following are used
  19.    Try tracing to see what is going on.
  20.  */
  21.  
  22. ((evaluate V V)
  23.  (integer V)
  24. )
  25. ((evaluate (E1 Operator E2) V)
  26.  (evaluate E1 V1) /* evaluate calls itself */
  27.  (evaluate E2 V2)
  28.  (apply_operator Operator V1 V2 V)
  29. )
  30.  
  31. ((apply_operator plus X Y Z)
  32.  (iplus X Y Z)
  33. )
  34. ((apply_operator minus X Y Z)
  35.  (iminus X Y Z)
  36. )
  37. ((apply_operator times X Y Z)
  38.  (imult X Y Z)
  39. )
  40.  
  41. /* What about global variables in expressions then?
  42.    Well a prolog work around is to 
  43.    add facts like these:
  44.  
  45.    (value x 56)
  46.    (value y 0)
  47.  
  48.  and an extra rule for evaluate as follows:
  49.  
  50. ((evaluate X V)
  51.  (value X V)
  52. )
  53.  That's all!
  54. */
  55.  
  56. ((demo5)
  57.  (evaluate (4 times ( 5 plus 6)) Value)
  58.  (display Value)
  59.  (nl)
  60. )
  61.